אלגוריתמים בתורת הגרפים פתרון תרגיל מס' 2 לשאלות והערות נא לפנות לאילן גרונאו (shrilan@cs.technion.ac.il) א) ב) ג) גרף דו-צדדי (bipartite) הינו גרף (E )G V, אשר קיימת חלוקה של צמתיו לשתי קבוצות U,W e = ( w, u) או e = ( w) הינה מצורת e E כך שכל קשת (U W = V, U W = φ ). u U, כאשר w W מצא תנאי מספיק והכרחי לכך שגרף לא-מכוון הוא דו-צדדי. הראה אלגוריתם יעיל שבודק אם גרף הוא דו-צדדי ואם כן מציע חלוקה U,W מתאימה. נתח את סיבוכיות האלגוריתם שהצעת. (1 1. גרף לא מכוון (E )G V, הוא דו צדדי אם"ם לא קיים בו מעגל באורך אי זוגי. התנאי הכרחי: נניח (E )G V, גרף דו צדדי, שכל צמת בו שייך או ל U או ל W (באופן בלעדי). נניח שיש בו מעגל,v1 ). נסמן ב U (בלי הגבלת הכלליות) את v2, v2k + 1, באורך אי זוגי (לאו דווקא פשוט) (v1 הקבוצה בה נמצא. v 1 ניתן לראות (באינדוקציה פשוטה) כי כל צמת v i עבור i זוגי שייך ל W, ( v1, v2k +1 ) E אבל. v1, וכל צמת v i עבור i אי זוגי (בפרט 1+ k ( v2 שייך ל U. מכאן ש v2k U 1+ בסתירה להנחה על דו צדדיות הגרף. התנאי מספיק: בסעיף הבא נראה שאם אין בגרף מעגל באורך אי זוגי האלגוריתם המוצע מוצא חלוקה של צמתי הגרף לקבוצות זרות ומשלימות. לכן התנאי מספיק למציאת חלוקה מתאימה לשתי קבוצות. :1 2. אלגוריתם לחישוב ובדיקת גרף דו צדדי בהינתן גרף לא מכוון (E,GV (, ושתי קבוצות ריקות.U,W נבצע אלגוריתם שהוא ואריאציה על BFS מצמת שרירותי s בגרף. כל צמת במרחק זוגי נכניס ל U וצמת במרחק אי זוגי נכניס ל W: אתחול: נאתחל תור ריק,Q לכל,d[v] = v V ו-.U = W = φ כל עוד קיים צמת s ב V כך ש = :d[s] הכנס את s לראש התור ואתחל = 0.d[s] כל עוד Q אינו ריק: הוצא את v מראש התור. אם d[v] זוגי הכנס את v ל- U, אחרת הכנס אותו ל- W. לכל צמת u שכן של v בצע: אם = d[u] אז הכנס את u לסוף התור ו- d[v]+1.d[u] := אחרת אם d[u] d[v]+ זוגי עצור ופלוט: "הגרף הוא לא דו צדדי!". הסבר: כמו BFS האלגוריתם מעדכן פעם אחת בלבד את d[v] לכל צמת בגרף, ומוודא לכל קשת ) פעם אחת לפחות כי d[u] d[v]+ אי זוגי. d[u] d[v]+ אי זוגי אם"ם הזוגיות של v ו- u שונה, כלומר הם נמצאים בקבוצות שונות. לכן אם האלגוריתם פולט חלוקה לשתי קבוצות אז הגרף דו צדדי. אם הוא פולט "הגרף הוא לא דו צדדי!" אז קיימת קשת ) בגרף כך שסכום המרחקים בין צמת s כלשהו בגרף ל- v ול- u הוא זוגי. קיים, אם כן, מעגל (לאו דווקא פשוט) -s -u-v- s באורך אי זוגי לכן הגרף (E GV (, אכן אינו גרף דו צדדי. אם לא קיים מעגל אי זוגי בגרף האלגוריתם לא ייעצר לפני שכיסה את כל צמתי הגרף. הערות: ניתן גם לבצע אלגוריתם דומה כואריאציה על,DFS אך מתבקש במקרה זה להשתמש ב BFS כיוון שניתן להסתמך על הנכונות, ולהיעזר במרחקים שהוא מחשב. חשוב לוודא שכיסינו את כל צמתי הגרף, ולא להפסיק כשהתור Q מתרוקן.
3. סיבוכיות:.( O( E + V האלגוריתם פועל כמו,BFS כך שבכל איטרציה מוסיפים מספר קבוע של פעולות (בדיקות והוספה לקבוצות U ו W). קוטר הגרף הינו המקסימום מבין המרחקים המינימליים בין זוגות צמתים בגרף. מצא אלגוריתם יעיל לחישוב הקוטר של עץ לא-מכוון. א) נתח את סיבוכיות האלגוריתם שהצעת. ב) (2 הרעיון: נבצע שתי ריצות.BFS האחת מצמת שרירותי s בגרף, והשניה מצמת u הרחוק ביותר מ- v. לצמת הרחוק ביותר ממנו- u קוטר הגרף הוא המרחק בין s. האלגוריתם: :2 בחר צמת שרירותי s בעץ, ובצע אלגוריתם BFS סטנדרטי על העץ מ- s. יהי u הצמת שיצא אחרון מתור BFS בשלב הקודם. בצע אלגוריתם BFS מצמת u. יהי v הצמת שיצא אחרון מתור BFS של u. קוטר העץ הוא המרחק של v מ- u. הסבר: המרחק בין שני צמתים בעץ- הוא אורך המסלול הפשוט היחיד ביניהם. בנוסף ניעזר בטענה הבאה: (קלה להוכחה) u i קיים צמת u 0 u 1 בהינתן עץ BFS מכוון המושרה על, ומסלול פשוט כלשהו- u k (שנקרא לו "ראש המסלול") במסלול כך שלכל >0 j i מתקיים u j אבא של 1 j ולכל j k מתקיים j 1 u אבא של.u j * נשים לב שראש המסלול הוא אב קדמון של כל הצמתים במסלול. i< נראה כי כל מסלול פשוט (מרחק) בגרף אינו ארוך יותר מהמסלול הפשוט בין v ל- u (שנסמן ב- p ). כלומר שהמרחק בין v ל- u הוא מירבי. יהיו x,y שני צמתים כלשהם בגרף ו p 1 המסלול הפשוט ביניהם, שהראש שלו (ביחס לעץ BFS המכוון ש- s הוא שרשו) הוא w. 1 -y. נסמן ב- w 2 את ראש המסלול, p 2 וב- z את הצמת הראשון נתבונן במסלול הפשוט p 2 מ- לu q q q q p p1 = x 1 2 = u 2 המשותף ל- p 1 ו-. p 2 כך שמתקיים z y ו z y (מדוע חלוקה זו אפשרית?). בנוסף מתקיים w 2 אב קדמון או צאצא של w 1 (מדוע זה מתחייב?), לכן נוכל לסמן את ה"בוגר" מבין השניים ב- w. w הוא אב קדמון של x,y,u (מדוע?). wנמצא 1 ב- q. כלומר ש- w נמצא ב- p 2 ובנוסף הוא ראש המסלול (מדוע?). נוכל נניח הצמת r r'. p2 מנכונות BFS נובע כי u הוא צמת בעל מרחק = u w אם כן לסמן מחדש: y מירבי מ- s, ו v בעל מרחק מירבי מ- u. לכן מתקיימת סדרת אי השוויונים (מדוע?): ( = p2 = r + r' = d( wu, ) + d( w, wx, ) + d( w, w1, x) + d( w1, p1 d = מה קורה אם wנמצא 1 ב- q? 1 2. סיבוכיות: האלגוריתם הוא על בסיס הפעלה כפולה של אלגוריתם BFS עם תוספת קבועה של פעולות בדיקה. מכאן שסיבוכיות האלגוריתם המוצע היא O( V ),O( E + V )= כיוון שבעץ לא מכוון מתקיים. E = V -1 הערה: רצוי להביא את הביטוי לסיבוכיות לצורה הפשוטה ביותר שלו כפונקציה של מספר הצמתים (אם אפשר) ומספר הקשתות (אם צריך).
.. s V ב) נתון גרף G(V,E) אשר כל אחת מקשתותיו צבועה באדום או שחור, וצומת א) הראה אלגוריתם, שיעילותו ) V O ( E +, המוצא לכל צמת v בגרף את המסלול הקצר ביותר מ- s העובר בקשת אדומה אחת לפחות. הראה אלגוריתם, שיעילותו ) V, O ( E + המוצא לכל צמת v בגרף את המסלול הקצר ביותר מ- s העובר בקשת אדומה אחת בדיוק. רמז: השתמשו ברדוקציה ל- BFS. (רדוקציה הינה טרנספורמציה של בעיה נתונה לבעיה אחרת, שאת פתרונה ניתן לתרגם לפתרון הבעיה המקורית). :3 (3 פתרון ב': רדוקציה ל- BFS. נעתיק את הבעיה לבעיה שקולה (על גרף אחר) הניתנת לפתרון על ידי אלגוריתם.BFS יש לוודא שההעתקה לא מוסיפה לסיבוכיות של אלגוריתם.BFS בהינתן גרף (E GV (, נגדיר גרף שכבות E E = E כך ש: E red V V = V ו- ( V = { v v V} V, G( כך ש- ) E) E' = {( u, v ) ( E}, Ered = {( u, ( isa rededgeing} ( ),V )G מצמת s. נוכיח כי לכל צמת v ב- V מתקיים נריץ אלגוריתם BFS על הגרף החדש (E d(s, (המרחק בין שני הצמתים ב- G ) הוא אורך המסלול הקצר ביותר מ- לs -v העובר בקשת אדומה אחת לפחות. E red (משפט "מסלול חוצה חתך"). כל מסלול מ- s ל- v עובר בקשת השייכת ל- d(s, הוא אורך המסלול הקצר ביותר מ- s ל- v. מסלול זה נראה כך: p= ( s u w לכן המסלול. E red s p = ( כאשר u,w)) קשת ב- u w הנמצא ב- G, העובר בקשת אדומה אחת לפחות-.(w) מכאן שקיים מסלול באורך d(s, העובר בקשת אדומה אחת לפחות. p = s u מסלול כלשהו ב- G,העובר בקשת אדומה אחת לפחות- u u יהי ) + ( 1 i i 1 v =p ( s u נמצא ב- G ואורכו זהה לזה של p. לכן א. ז המסלול ) 1 ui ui+ 1 v ( u i u i+ 1) s. p = p d( מ.ש.ל מנכונות BFS נובע:, V, G( כך 2. נבצע העתקה דומה. הפעם לגרף מכוון: בהינתן גרף (E GV (, נגדיר גרף שכבות מכוון (E 1 2 E = Eblack Eblack Ered 1 2 black = {( ( isa black edgeing}, Eblack = {( u, v V V = V ו- ( V = { v v V} ) פתרון א': ניתן לבצע וריאציה על BFS כאשר לכל צמת v מעדכנים שני ערכים תוך כדי הריצה: -v אורך המסלול הקצר ביותר מ- לs :λ( -v. אורך המסלול השחור הקצר ביותר מ- לs λ: b ( המכיל קשת אדומה אחת לפחות/בדיוק. האלגוריתם דומה מאוד לאלגוריתם לחישוב אורך מסלול זוגי מינימלי שהוצג בתרגול. יש לשים לב שכל צמת יכול להיכנס לתור ה- BFS (להתעדכן) פעמיים (לכל היותר). E ) ( isa black edgeing}. E red = {( u, ( isa rededgeing} ניתן להראות נכונות באופן דומה. ההבדל כאן הוא שבגרף הנוצר ע"י הרדוקציה הזו בכל מסלול מכוון יש לכל היותר קשת אדומה אחת (כי לא ניתן לעבור מ- לV ). - V ש-
(4 שורש בגרף מכוון הינו צומת בגרף ממנו קיים מסלול מכוון לכל הצמתים בגרף. א) נתון גרף מכוון (E )G. V, הצע אלגוריתם שסיבוכיותו ) E )O המוצא שורש ב- G, או מודיע שאין כזה. ב) הוכח את נכונות האלגוריתם. הרעיון: נריץ DFS מצמת שרירותי s בגרף. אם פרשנו את כל הגרף אז s הוא שרש של הגרף. אם לא- נבחר צמת אחר אליו טרם הגענו ונריץ ממנו,DFS וחוזר חלילה עד שנכסה את כל הגרף ע"י יער.DFS יהי r הצמת האחרון ממנו הרצנו ;DFS הוא "מועמד לשרש הגרף". נריץ ממנו DFS (על כל הגרף מחדש). אם עץ ה- DFS החדש פורש את הגרף אז r הוא שרש הגרף. אחרת לא קיים שרש לגרף :4. האלגוריתם : מציאת "מועמד לשרש הגרף": סמן כל v ב- כV "חדש". אתחל מחסנית S ריקה. כל עוד קיים s "חדש" ב- V : סמן את s כ"ישן" והכנס אותו למחסנית S. כל עוד המחסנית S אינה ריקה: הוצא את v מראש המחסנית. הכנס כל שכן "חדש" של v לראש המחסנית. בדיקת המועמד: יהי r הצמת האחרון שהוצאנו מהמחסנית. סמן את כל הצמתים ב- כV "חדשים" ובצע DFS מ- r. אם כל הצמתים "ישנים" החזר את r בתור שרש. אם לא החזר: "אין שרש בגרף (E."GV (, סיבוכיות: אנו מבצעים שתי סריקות אתחול לצמתים-,V ) )O ושתי סריקות על כל הקשתות בגרף (אחת בבניית יער ה- DFS, ואחת באלגוריתם הבדיקה בסוף)-.O( E ) לפני ריצת האלגוריתם נבדוק כי. E > V -2 אם התנאי לא מתקיים אז הגרף לא קשיר (מדוע?) ולגרף אין שרש. אם.O( E + V )=O( E ) נריץ את האלגוריתם למעלה בסיבוכיות E > V -2 2. הוכחת נכונות: אם האלגוריתם למעלה מחזיר צמת r בתור שרש אז r שרש של G. אחרי ריצת DFS בסוף האלגוריתם כל צמת בגרף שייך לעץ DFS ששורשו r, לכן מנכונות DFS נובע כי קיים מסלול מכוון מ- r לכל צמת בגרף G. אם קיים שרש s בגרף מכוון G אז האלגוריתם למעלה מחזיר צמת כלשהו r שהוא שרש של G (האם בהכרח.(?r=s מנכונות,DFS בו השתמשנו בחלק הראשון של האלגוריתם (מציאת "מועמד לשרש הגרף") כל צמת בגרף נכנס פעם אחת בדיוק למחסנית ויוצא ממנה פעם אחת בדיוק. נתבונן בצמת r הנמצא בתחתית המחסנית ברגע בו הוצאנו את השרש s מהמחסנית. טענה 1: r שרש של הגרף G. מנכונות DFS נובע כי בכל רגע נתון קיים מסלול (מכוון) מהצומת בתחתית המחסנית (שרש עץ ביער DFS של הגרף G) לכל הצמתים הנמצאים באותו רגע במחסנית; לכן s ישיג מ- r. כל צמת בגרף ישיג מ- s (כי הוא שרש של G), ולכן כל צמת בגרף ישיג גם מ- r. טענה 2: אחרי הוצאת הצמת r מהמחסנית כל הצמתים בגרף מסומנים "ישנים". כל הדיון הבא מתייחס לנקודה בזמן בה הוצאנו את r מהמחסנית. נניח קיים צמת v שאינו מסומן. p = ( r u כ"ישן" (לא הוכנס ל- S ). v ישיג מ- r (טענה 1), לכן קיים מסלול מכוון ) 1 ui ui + 1v אינדקס מירבי) שאינו מסומן כ"ישן" (קיים כזה מפני ש- r (בעל p הצמת האחרון במסלול u i יהי r הוא "ישן" אך אינו נמצא במחסנית (הוצאת u i 1+i u אינו מסומן כ"ישן". מסומן כ"ישן" ו- v לא)..I.II
u i מהמחסנית מהמחסנית משאירה אותה ריקה), לכן הוא יצא מהמחסנית. גם ברגע הוצאתו של u i 1+i u לא היה מסומן כ"ישן" (צמת המסומן כ"ישן" נשאר "ישן"). מיד אחרי הוצאתו של 1+i u) למחסנית ומסמנים אותם מהמחסנית מכניסים את כל השכנים ה"חדשים" שלו (בפרט 1+i u עדיין אינו מסומן כ"ישן". כ"ישנים", בסתירה לכך ש- מסקנה: אחרי הוצאת r מהמחסנית כל הצמתים "ישנים", לכן r הוא "מועמד לשרש הגרף". הצמת r הוא אכן שרש של הגרף G, ולכן ריצת הבדיקה תצליח ו- r יוחזר כשרש הגרף. לכן האלגוריתם מחזיר צמת כלשהו (r) שהוא שרש של G. מ.ש.ל א) רכיב קשיר-היטב בגרף מכוון (E )G V, הינו תת-קבוצה של צמתים V ' V כך שלכל זוג צמתים ברכיב ' V v קיימים ב- Gמסלולים מכוונים. u v, v u מצא אלגוריתם למציאת רכיבים קשירים-היטב בגרף מכוון, שיעילותו. O ( E + V ) (5 :5. E = {( ( v, u) נגדיר את הגרף ההפוך ל- G : G ( V, E ) כך ש-{ E ניעזר בטענות הבאות (מומלץ לנסות להוכיח עצמאית): 1. רכיבי הצמתים הקשירים היטב (מקסימליים) ב- G וב G- זהים. 2. בכל ריצת DFS על G מקבלים יער של עצי- DFS. כל רכיב קשירות מוכל (על כל צמתיו) בעץ DFS כלשהו. בהינתן יער DFS של הגרף G ניתן לסווג כל קשת ) בגרף לאחת הקבוצות הבאות לפחות: v באותו רכיב קשירות..DFS בהרצת מציין את זמן הנסיגה מ- v finish[v] כאשר,finish[v]<finish[u] מסקנה: אין קשתות נכנסות לרכיב הקשירות של הצמת ממנו DFS נסוג אחרון. כלומר שב- G אין קשתות יוצאות מרכיב הקשירות של הצמת ממנו DFS נסוג אחרון. האלגוריתם: הרץ DFS על הגרף G על מנת לקבל יער DFS מכוון הכולל את כל צמתי הגרף. בכל פעם שהשגרה הרקורסיבית נסוגה מצמת v הכנס אותו למחסנית S. חשב את הגרף ההפוך- G. הרץ DFS על הגרף G על מנת לקבל יער,DFS כאשר סדר בחירת הצמתים (שרשי עצי היער) הוא בהתאם לסדר הופעתם במחסנית S (סדר יורד של.(finish כל עץ DFS ביער המתקבל הוא רכיב קשיר היטב (מקסימלי) של G. נכונות: נובעת מהטענות למעלה + אינדוקציה על מספר רכיבי הקשירות המקסימליים ב- G. סיבוכיות: שתי ריצות DFS וחישוב.O( E + V ):G.3.4